package com.xiangxg.jvm.classloader;

/**
 * 观察Mycat和MySample的类加载器
 * 测试场景
 * 一、Mycat和MySample的class文件都删掉（使用自定义加载器从指定路径加载Mycat和MySample）
 * 二、删Mycat的class文件
 * 三、删MySample的class文件（使用自定义加载器从指定路径加载MySample，双亲委托机制系统类加载器加载Mycat）
 * 四、删MySample的class文件,在mycat类构造器中添加如下代码
 *  System.out.println("mycat form :" + MySample.class);
 *  由于父类加载器看不到子类加载器（loader1自定义加载器）加载的类，因此报错
 */
public class MyTest17_1 {
    public static void main(String[] args) throws Exception{
        MyTest16 loader1 = new MyTest16("loader1");
        loader1.setPath("C:\\java\\code\\");

        Class<?> clazz = loader1.loadClass("com.xiangxg.jvm.classloader.MySample");
        System.out.println("class: "+clazz.hashCode());
        //-XX:+TraceClassLoading
        //注掉该行，那么并不会实例化MySample对象,即MySample构造方法不会被调用
        //因此不会实例化Mycat对象，即没有对Mycat进行主动使用，这里不会加载Mycat Class
        //其他情况则不一定，可能会出现系统预加载情况，具体添加-XX:+TraceClassLoading观察类加载情况
        Object object = clazz.newInstance();
    }
}
